//
//  main.c
//  结构体的内存分析
//
//  Created by ws on 2017/7/25.
//  Copyright © 2017年 王松. All rights reserved.
//

#include <stdio.h>

/**
 相同类型数据的结构体
 1.结构体变量的地址就是第一个成员的地址
 2.结构体类型本身是不占用存储空间的,就如int 是不占用存储空间一样
 3.对于相同类型的结构体所占用的存储空间为所有成员之和

 */
void test(){
    struct Date{
        int year;
        int month;
        int day;
    };//结构体类型本身不占用存储空间
    struct Date date;
    printf("%p\n",&date);
    printf("%p\n",&date.year);
    
    unsigned long size = sizeof(struct Date);
    printf("%lu\n",size);
}
/**
 不同类型数据的结构体
 1.为了快速的访问数据,结构体内部有一个补齐算法,默认情况下它一定是占用存储空间的最大成员的倍数
 2.默认情况下一组占用多少个字节取决于最大成员所占用的存储空间
 */
void test1(){
    struct Person{
        //        int age;//4
        char sex;//1
        //        char test;//1
        //        short sb;//2
        double d;//8
    };
    size_t size = sizeof(struct Person);
    printf("%lu\n",size);//默认8的倍数(补齐算法 16)
}
/**
 不同类型数据的结构体
 指定一组所占用的存储空间
 #pragma pack(8) 1,2,4,8,.... 一定是2的密数,这个数小于最大成员所占用的存储空间才能有效果
 */
#pragma pack(4)
void test2(){
    struct Person{
        char sex;//4
        double d;//8
    };
    size_t size = sizeof(struct Person);
    printf("%lu\n",size);// 12
}
int main(int argc, const char * argv[]) {
    test1();
#pragma pack(2)
    struct A{
        int my_test_a;//4
        char my_test_b; //2
        double my_struct_a;//8
        int my_struct_b;//4
        char my_struct_c;//2
    };
    
    size_t size =  sizeof(struct A);
    printf("%lu\n",size);//20
    return 0;
}
